package org.finesys.common.netty.websocket.stomp.handler;

import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;

import org.finesys.common.netty.websocket.stomp.constants.StompVersion;
import org.finesys.common.netty.websocket.stomp.entity.StompSubscription;
import org.finesys.common.netty.websocket.stomp.support.StompWebSocketEndpointEventServer;
import org.finesys.common.netty.websocket.support.WebSocketEndpointConfig;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.util.concurrent.EventExecutorGroup;

/**
 * 自定义处理协议内容
 * <p>
 * <p>
 * 参考：
 * https://github.com/CG-Lin/whales-netty
 * https://gitee.com/shiquxingyang/websocket-server
 */
public class StompServerHandler2 extends SimpleChannelInboundHandler<Object> {


    // WebSocket事件服务器
    private final StompWebSocketEndpointEventServer webSocketEndpointEventServer;

    // WebSocket端点配置
    private final WebSocketEndpointConfig webSocketEndpointConfig;

    // 事件执行器组
    private final EventExecutorGroup eventExecutorGroup;


    // 存储聊天目的地的订阅信息
    private final ConcurrentMap<String, Set<StompSubscription>> chatDestinations = new ConcurrentHashMap<>();

    /**
     * 构造方法，初始化WebSocket事件服务器、端点配置和事件执行器组。
     *
     * @param webSocketEndpointEventServer WebSocket事件服务器实例。
     * @param webSocketEndpointConfig      WebSocket端点配置对象。
     * @param eventExecutorGroup           事件执行器组，用于处理异步任务。
     * @param isCors                       是否启用跨源资源共享（CORS）。
     */
    public StompServerHandler2(StompWebSocketEndpointEventServer webSocketEndpointEventServer, WebSocketEndpointConfig webSocketEndpointConfig, EventExecutorGroup eventExecutorGroup) {
        this.webSocketEndpointEventServer = webSocketEndpointEventServer;
        this.webSocketEndpointConfig = webSocketEndpointConfig;
        this.eventExecutorGroup = eventExecutorGroup;

    }

    @Override
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
        if (evt instanceof WebSocketServerProtocolHandler.HandshakeComplete) {
            //获取stomp协议版本
            StompVersion stompVersion = StompVersion.findBySubProtocol(((WebSocketServerProtocolHandler.HandshakeComplete) evt).selectedSubprotocol());
            //设置stomp协议版本
            ctx.channel().attr(StompVersion.CHANNEL_ATTRIBUTE_KEY).setIfAbsent(stompVersion);
        } else {
            super.userEventTriggered(ctx, evt);
        }
    }

    /**
     * 处理从客户端接收到的STOMP帧。
     *
     * @param ctx          通道处理器上下文，包含通道、管道等信息。
     * @param inboundFrame 接收到的STOMP帧。
     * @throws Exception 解码或处理帧时可能抛出的异常。
     */
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, Object inboundFrame) throws Exception {
        System.out.println(inboundFrame.toString());
    }

    @Override
    public void channelRegistered(ChannelHandlerContext ctx) throws Exception {
        System.out.println(ctx.toString());
    }



}
